package com.xsir.common;

import lombok.Data;
import org.springframework.http.HttpStatus;

import java.io.Serializable;
import java.util.Map;

/**
 * @author user
 * @date 2020/9/2
 * <p>
 * 统一结果返回类。
 * 构造器私有，不允许进行实例化，但提供静态方法 ok、error 返回一个实例。
 * <p>
 * 静态方法说明：
 * - ok     返回一个【成功操作】的结果（实例对象）。
 * - error  返回一个【失败操作】的结果（实例对象）。
 * <p>
 * 普通方法说明：
 * - success      用于自定义响应是否成功
 * - code         用于自定义响应状态码
 * - message      用于自定义响应消息
 * - data         用于自定义响应数据
 */
@Data
public class Result implements Serializable {
    /**
     * 响应状态码
     */
    private Integer code;

    /**
     * 响应消息
     */
    private String message;

    /**
     * 响应数据
     */
    private Object data;

    /**
     * 默认构造方法私有化
     */
    private Result() {

    }

    /**
     * 私有化全参构造方法
     * @param message   响应消息
     * @param code      响应状态码
     * @param data      响应数据
     */
    private Result(String message, Integer code, Object data) {
        this.message = message;
        this.code = code;
        this.data = data;
    }

    /**
     * 返回一个不带数据的【成功操作】结果
     *  - message: "ok"
     *  - code: 200
     *  - data: null
     *
     * @return  结果
     */
    public static Result ok() {
        return new Result("ok", 200, null);
    }
    
    /**
     * 返回一个带数据的【成功操作】结果
     *  - message: "ok"
     *  - code: 200
     *
     * @param data data
     * @return  结果
     */
    public static Result ok(Object data) {
        return new Result("ok", 200, data);
    }

    /**
     * 返回一个自定义消息的【成功操作】结果
     *  - code: 200
     *  - data: null
     *
     * @return  结果
     */
    public static Result ok(String message) {
        return new Result(message, 200, null);
    }

    /**
     * 返回一个自定义消息和数据的【成功操作】结果
     *  - code: 200
     *
     * @return  结果
     */
    public static Result ok(String message, Object data) {
        return new Result(message, 200, data);
    }

    /**
     * 返回一个不带数据的【失败操作】结果
     *  - message: "error"
     *  - code: 500
     *  - data: null
     *
     * @return  结果
     */
    public static Result error() {
        return new Result("error", 500, null);
    }

    /**
     * 返回一个自定义消息的【失败操作】结果
     *  - code: 500
     *  - data: null
     *
     * @return  结果
     */
    public static Result error(String message) {
        return new Result(message, 500, null);
    }

    /**
     * 返回一个自定义消息和响应码的【失败操作】结果
     *  - data: null
     *
     * @return  结果
     */
    public static Result error(String message, Integer code) {
        return new Result(message, code, null);
    }

    public Result data(Object data) {
        this.data = data;
        return this;
    }
}
